/*
代理模式：先写个公共接口抽象类，再写基于抽象类的实现类（被代理类），代理类中包含被代理类的对象，并通过该调用被代理类的相关方法。
*/


class BaseClass{
public:
    virtual void app1() = 0;
    virtual void app2() = 0;
    virtual ~BaseClass() {}
};

class ConcreteClass1 : public BaseClass{
public:
    void app1(){
        printf("This ConcreteClass1 app1.\n");
    }
    void app2(){
        printf("This ConcreteClass1 app2.\n");
    }
};

class ConcreteClass2 : public BaseClass{
public:
    void app1(){
        printf("This ConcreteClass2 app1.\n");
    }
    void app2(){
        printf("This ConcreteClass2 app2.\n");
    }
};

class Proxy : public BaseClass{
private:
    BaseClass* pBaseClass;
public:
    Proxy(BaseClass* p) : pBaseClass(p) {}

    void app1(){
        pBaseClass->app1();
    }

    void app2(){
        pBaseClass->app2();
    }
};